package basicSet;

import java.math.BigDecimal;//对BigDecimal来说，如果是valueOf(double) 且转换后的值是7位整数及以内，则输出还是会带".0"；此外默认的toString是用科学计数法表示的，toPlainString是展开；
import java.math.BigInteger; //大整数里没有toPlainString 整数没有这个问题；
import java.util.ArrayList;
import java.util.Scanner;

public class Factorial_vip_diy_faster {
	
	
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		
		ArrayList<Long> sl = new ArrayList<>(); 
		BigInteger res0 = null;
		
		long start = System.nanoTime();
		
		long res = 1;
		int index = 0;
		while (index < n) {
			 //* 这个思路很巧妙呀！ n的阶乘最大乘以n，只要乘以n不溢出，进行迭代运算就一定不会溢出；
			if( res >= Long.MAX_VALUE / n ) { //是否能保证迭代运算不溢出；
				sl.add(res);
				res = 1;
				continue;
			}
			
			res *= index+1;			//开始具体操作，迭代跟递归非常相似；
			
			index++;	//状态更新；
		}
//		while(index < n) {
//			res0 = res0.multiply( BigDecimal.valueOf(index+1) );
//		}
//		System.out.println(res0==null ? String.format("%.0f", res) : res0.toPlainString());
		
		res0 = BigInteger.valueOf(res); //最后一次迭代未达到进入集合条件的项；
//		System.out.println(res0);  
		for (long s : sl) {
			res0 = res0.multiply(BigInteger.valueOf(s));
		}
		
		long end = System.nanoTime();
		System.out.println( "时间: " + ( (end - start) / 1000000000.0 ) );     
		
//		System.out.println(res0);
		
//		String ss = res0.toPlainString();     
//		if(ss.endsWith(".0"))		 		//这里的判断 如果溢出临界值用long来表示 应该就可以省略了
//			System.out.println(ss.substring(0, ss.length()-2));
//		else
//			System.out.println(ss);
			
	
	}
	
	
}
